Update pomoci DB controls. kdyz je v tabulce JOIN, FireBird

Otázka od: Benda Lukas

9. 12. 2003 19:08

Potrebuji tabulky spojit pomoci JOIN nebo GROUP BY, ale pak potrebuju
pomoci standardnich ovladacich updatovat policka v obou tabulkach.
Pomoci SQL.Update umim updatovat jednu z nich. Jak updatovat oba? (pokud
mozno pomoci IBX, nebo FIBplus)

Lukas Benda


Odpovedá: petr palicka

10. 12. 2003 7:25

Ahoj,

   ja mam podobny problem vyresen v IBX. Pouzivam
TIBDataSet. Vystrihl jsem ti ho z DFM a jeste
dodavam udalost BeforePost, kde si resim update
joinovane tabulky. Asi se zalamou radky, ale
snad ti to bude zrejme. Me staci update pripojene
tabulky jenom v pripade, ze sloupec ASpravce nastavim
na hodnotu A, ty si to uprav podle svyho.

peca

inherited IBDataSet1: TIBDataSet
   BeforePost = IBDataSet1BeforePost
   DeleteSQL.Strings = (
     'delete from AKCIE'
     'where'
     ' AKCIE = :OLD_AKCIE')
   InsertSQL.Strings = (
     'insert into AKCIE'
     ' (AKCIE, Osoba, APOHYB, SERIE, ACISLO, CDIL, JDIL,'
     ' ADATUM, DATZM, DATPOR, POZN, Davka, Platna)'
     'values'
     ' (:AKCIE, :Osoba, :APOHYB, :SERIE, :ACISLO, :CDIL, :JDIL,'
     ' :ADATUM, :DATZM, :DATPOR, :POZN, :Davka, :Platna)')
   RefreshSQL.Strings = (
     'Select'
     ' A.AKCIE, A.Osoba, O.RC, O.PJM, A.APOHYB, CP.APNAZEV, CP.AKS,'
     ' A.SERIE, A.ACISLO, A.CDIL, A.JDIL, A.ADATUM, A.POZN, A.Davka,'
     ' A.DATZM, A.DATPOR, Sp.ASpravce, A.DKS, A.Platna, D.OP'
     'from'
     ' Osoba O'
     ' inner join AKCIE A on O.Osoba = A.Osoba'
     ' left join CisAPoh CP on CP.APohyb = A.APohyb'
     ' left join Spravce Sp on Sp.Serie = A.Serie and'
     ' Sp.ACislo = A.ACislo and'
     ' Sp.Osoba = A.Osoba'
     ' left join Davka D on D.Davka = A.Davka'
     'where'
     ' AKCIE = :AKCIE')
   SelectSQL.Strings = (
     'Select'
     ' A.AKCIE, A.Osoba, O.RC, O.PJM, A.APOHYB, CP.APNAZEV, CP.AKS,'
     ' A.SERIE, A.ACISLO, A.CDIL, A.JDIL, A.ADATUM, A.POZN, A.Davka,'
     ' A.DATZM, A.DATPOR, Sp.ASpravce, A.DKS, A.Platna, D.OP'
     'from'
     ' Osoba O'
     ' inner join AKCIE A on O.Osoba = A.Osoba'
     ' left join CisAPoh CP on CP.APohyb = A.APohyb'
     ' left join Spravce Sp on Sp.Serie = A.Serie and'
     ' Sp.ACislo = A.ACislo and'
     ' Sp.Osoba = A.Osoba'
     ' left join Davka D on D.Davka = A.Davka')
   ModifySQL.Strings = (
     'update AKCIE'
     'set'
     ' Osoba = :Osoba,'
     ' APOHYB = :APOHYB,'
     ' SERIE = :SERIE,'
     ' ACISLO = :ACISLO,'
     ' CDIL = :CDIL,'
     ' JDIL = :JDIL,'
     ' ADATUM = :ADATUM,'
     ' POZN = :POZN,'
     ' Platna = :Platna'
     'where'
     ' AKCIE = :OLD_AKCIE')
   GeneratorField.Field = 'AKCIE'
   GeneratorField.Generator = 'GNR_KLIC'
   Top = 160
end

procedure TfRegAkcie.IBDataSet1BeforePost(DataSet: TDataSet);
var
   q: TIBSQL;
   DoCommit: Boolean;
begin
   if DataSet.FieldByName('ASPRAVCE').AsString='A' then
     begin // staci hlidat nastaveni na "A"
       q:=TIBSQL.Create(Self);
       try
         q.Transaction:=TIBDataSet(DataSet).Transaction;
         q.Database:=TIBDataSet(DataSet).Database;
         q.SQL.Text:=
           'update Spravce set'#13+
           ' Osoba = '+DataSet.FieldByName('Osoba').AsString+#13+
           'where'#13+
           ' Serie = '''+DataSet.FieldByName('Serie').AsString+''' and'#13+
           ' ACislo = '+DataSet.FieldByName('ACislo').AsString;
         q.ExecQuery;
       finally
         q.Free;
       end;
     end;
   inherited;
end;